#include <QtGui/QMessageBox>
#include <QWSInputMethod>
#include "ipmethod.h"
#include <QDebug>
#include <QPointer>

#include <QTextCodec>
INPUTMethod::INPUTMethod(): QWSInputMethod()
{
    qDebug()<<"INPUTMethod() start";
    p_keyboard = new keyboard(this);
    //下面两行代码是我自己加的
   // QDesktopWidget *pDesk = QApplication::desktop();
   // p_keyboard->move((pDesk->width() - w.width()) / 2, (pDesk->height() - w.height()) / 2);

    //2020.11.23 需要gbk
    QTextCodec *tc = QTextCodec::codecForName("utf-8");
    QTextCodec::setCodecForLocale(tc);
    QTextCodec::setCodecForCStrings(tc);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
}

INPUTMethod::~INPUTMethod()
{
    delete this->p_keyboard;
}


// //在这里处理鼠标移动事件
void INPUTMethod::mouseMoveEvent(QMouseEvent *e)
{

    int x=e->pos().x();
    int y=e->pos().y();
    if(x<200 || x> 300)
    {
        p_keyboard->setGeometry(0,y,p_keyboard->width(),p_keyboard->height());
    }
}

void INPUTMethod::moveEvent(QMoveEvent * event)
{
    int x=event->pos().x();
    int y=event->pos().y();
    if(x<200 || x> 300)
    {
        p_keyboard->setGeometry(0,y,p_keyboard->width(),p_keyboard->height());
    }
}

void INPUTMethod::PreeditContent(char newcontent)
{
    content.clear();
    content += newcontent;
    sendCommitString(content);
}

void INPUTMethod::ConfirmContent()
{
    QKeyEvent *key = new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier);
    QCoreApplication::postEvent(QApplication::focusWidget(), key);

}

void INPUTMethod::BackspaceContent()
{
    if(content.isNull() == false)
        content.chop(1);
    else
    {
        QKeyEvent *key = new QKeyEvent(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);
        QCoreApplication::postEvent(QApplication::focusWidget(), key);
    }
}

void INPUTMethod::Escape()
{
    if(NULL == p_keyboard)
       return;
    else
      p_keyboard->hide();
}

void INPUTMethod::updateHandler(int type)
{
/* 代码优化思路(1):
 * 通过这个静态变量 i 的打印值，我观察到 i 是可以增加的，
 * 说明每次输入法面板启动之后都会执行当前函数，也就是说，
 * 如果想让输入法面板的显示位置变化的话，通过修改这里的代
 * 码确实是可行的！
*/

#if 0
    static  int i = 0;
    int inputPosY = 0;

    QPoint p = QCursor::pos();
    inputPosY = p.y();

    //观察 i 和屏幕上点击的坐标
    qDebug()<<"test:  "<<++i<<"px"<<p.x()<<"py"<<p.y();

    /*  480 这个值是我在调试的时候观察出来的，感觉这个值会比较适合 */
    if( p.y() >= 480 )   // 如果点击的位置的坐标大于或者等于480
    {
        inputPosY = inputPosY- 284 - 30;
        /*
         * 248 是输入法面板的高度，但是我以后应该会改变输入面板的高度，
         * 所以这个值可能还会变化的。30 则是我观察后觉得比较适合的数值
         */

    }
    else
    {
        inputPosY += 30;
    }

    QWidget *w = QApplication::focusWidget();

    switch(type)
    {
    case QWSInputMethod::FocusIn:


           if(p_keyboard == NULL)
               p_keyboard = new keyboard(this);


#if 0
           if( w && !w->inherits("QLineEdit"))
           {
               p_keyboard->move (0,inputPosY);
               p_keyboard->show();  //显示输入法面板
                break;
           }else if( w && !w->inherits("QComboBox"))
           {
               p_keyboard->move (0,inputPosY);
               p_keyboard->show();  //显示输入法面板
                break;
           }else if( w && !w->inherits("QAbstractItemView"))
           {
               p_keyboard->move (0,inputPosY);
               p_keyboard->show();  //显示输入法面板
                break;
           }
           else
           {
               p_keyboard->move (0,inputPosY);
               p_keyboard->show();  //显示输入法面板
           }
#else
           if( w && w->inherits("QLineEdit"))
           {
               p_keyboard->move (0,inputPosY);
               p_keyboard->show();  //显示输入法面板
                break;
           }
           else if( w && w->inherits("QTextEdit"))
           {
               p_keyboard->move (0,inputPosY);
               p_keyboard->show();  //显示输入法面板
                break;
           }
           else
           {
               if(p_keyboard != NULL)
               {
                 delete p_keyboard;
                   p_keyboard=NULL;
               }
           }

#endif
           //p_keyboard->move (100,200);       //
           //p_keyboard->move (0,250);//设置输入法面板在屏幕上显示的位置,此处参数已被我修改



           break;
    case QWSInputMethod::FocusOut:
            if(p_keyboard != NULL)
            {
              delete p_keyboard;
                p_keyboard=NULL;
            }
          //  break;
    default:
            break;
    }

#endif
    QWSInputMethod::updateHandler(type);
}

void INPUTMethod::ShowKeyBoard(QObject *obj)
{
    int inputPosY = 0;
    QWidget *w =  NULL;

    QPoint p = QCursor::pos();
    inputPosY = p.y();

    //观察 i 和屏幕上点击的坐标

    /*  480 这个值是我在调试的时候观察出来的，感觉这个值会比较适合 */
    if( p.y() >= 480 )   // 如果点击的位置的坐标大于或者等于480
    {
        inputPosY = inputPosY- 284 - 30;
        /*
         * 248 是输入法面板的高度，但是我以后应该会改变输入面板的高度，
         * 所以这个值可能还会变化的。30 则是我观察后觉得比较适合的数值
         */

    }
    else
    {
        inputPosY += 30;
    }

    w = QApplication::focusWidget();
    //w = (QWidget*)obj;

    //触发声音
    //system("/bin/app_pwm");

    if( w )
    {
        if( w->inherits("QLineEdit") || (w->inherits("QTextEdit")))
        {
            if(p_keyboard->isHidden())
            {
                p_keyboard->move (0,inputPosY);
                p_keyboard->show();  //显示输入法面板
            }
        }
    }
}

void INPUTMethod::HideKeyBoard()
{
    if(p_keyboard)
    {
        if(!p_keyboard->isHidden())
        {
            p_keyboard->hide();
        }
    }
}

QRect INPUTMethod::GetMethodRect()
{
    return p_keyboard->geometry();
}

